//    Openbravo POS is a point of sales application designed for touch screens.
//    Copyright (S) 2007-2009 Openbravo, S.L.
//    http://www.openbravo.com/product/pos
//
//    This file is part of Openbravo POS.
//
//    Openbravo POS is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    Openbravo POS is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with Openbravo POS.  If not, see <http://www.gnu.org/licenses/>.

package com.openbravo.data.loader.serialize;

import e.odbo.data.util.StringUtils;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;
import java.math.BigDecimal;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

/**
 * @author adrian
 */
public class DataWriteUtils {

    private static DateFormat tsf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    /**
     * Creates a new instance of DataWriteUtils
     */
    public DataWriteUtils() {
    }

    public static String getSQLValue(Object obj) {
        if (obj == null) {
            return "NULL";
        } else if (obj instanceof Double) {
            return getSQLValue((Double) obj);
        } else if (obj instanceof Integer) {
            return getSQLValue((Integer) obj);
        } else if (obj instanceof Boolean) {
            return getSQLValue((Boolean) obj);
        } else if (obj instanceof Short) {
            return getSQLValue((Short) obj);
        } else if (obj instanceof Float) {
            return getSQLValue((Float) obj);
        } else if (obj instanceof BigDecimal) {
            return getSQLValue((BigDecimal) obj);
        } else if (obj instanceof Clob) {
            return getSQLValue((Clob) obj);
        } else if (obj instanceof Blob) {
            return getSQLValue((Blob) obj);
        } else if (obj instanceof Long) {
            return getSQLValue((Long) obj);
        } else if (obj instanceof String) {
            return getSQLValue((String) obj);
        } else if (obj instanceof Date) {
            return getSQLValue((Date) obj);
        } else if (obj instanceof Object[]) {
            return getSQLValue((Object[]) obj);
        } else {
            return getSQLValue(obj.toString());
        }
    }

    public static String getSQLValue(Object[] oValues) {
        if (oValues == null) {
            return "NULL";
        } else {
            ArrayList<String> sb = new ArrayList<String>();
            for (Object o : oValues)
                sb.add(getSQLValue(o));
            return StringUtils.join( sb.iterator(),",");
        }
    }

    public static String getSQLValue(Integer iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return iValue.toString();
        }
    }

    public static String getSQLValue(Short iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return iValue.toString();
        }
    }

    public static String getSQLValue(Float iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return iValue.toString();
        }
    }

    public static String getSQLValue(Long iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return iValue.toString();
        }
    }

    public static String getSQLValue(BigDecimal iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return iValue.toString();
        }
    }

    public static String getSQLValue(Clob iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            String retStr="error";
            try {
                 retStr=clobToString(iValue);
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return retStr;
        }
    }

    public static String getSQLValue(Blob iValue) {
        if (iValue == null) {
            return "NULL";
        } else {
            return convertBlobToString(iValue);
        }
    }


    public static String getSQLValue(Double dValue) {
        if (dValue == null) {
            return "NULL";
        } else {
            return dValue.toString();
        }
    }

    public static String getSQLValue(Boolean bValue) {
        if (bValue == null) {
            return "NULL";
        } else {
            return bValue.booleanValue() ? "TRUE" : "FALSE";
        }
    }

    public static String getSQLValue(String sValue) {
        if (sValue == null) {
            return "NULL";
        } else {
            return '\'' + getEscaped(sValue) + '\'';
        }
    }

    public static String getSQLValue(Date dValue) {
        if (dValue == null) {
            return "NULL";
        } else {
            return "{ts '" + tsf.format(dValue) + "'}";
        }
    }

    public static String getEscaped(String sValue) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < sValue.length(); i++) {
            switch (sValue.charAt(i)) {
                case '\\':
                    sb.append("\\\\");
                    break;
                case '\'':
                    sb.append("\\'");
                    break;
                case '\n':
                    sb.append("\\n");
                    break;
                case '\r':
                    sb.append("\\r");
                    break;
                default:
                    sb.append(sValue.charAt(i));
                    break;
            }
        }
        return sb.toString();
    }


    public static String clobToString(Clob sc) throws SQLException, IOException {
        String reString = "";
        Reader is = sc.getCharacterStream();
        BufferedReader br = new BufferedReader(is);
        String s = br.readLine();
        StringBuffer sb = new StringBuffer();
        while (s != null) {
            sb.append(s);
            s = br.readLine();
        }
        reString = sb.toString();
        return reString;
    }

    public static String convertBlobToString(Blob blob){
        String result = "";
        try {
            ByteArrayInputStream msgContent =(ByteArrayInputStream) blob.getBinaryStream();
            byte[] byte_data = new byte[msgContent.available()];
            msgContent.read(byte_data, 0,byte_data.length);
            result = new String(byte_data);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

}
